//
//  BasicModel.swift
//  Webo10
//
//  Created by ChengXiwu on 2017/7/31.
//  Copyright © 2017年 ChengXiwu. All rights reserved.
//

import UIKit

// 所有模型基类
class BasicModel: NSObject, NSCoding {
    
    override init() {
        super.init()
    }
    
    required init(dict: [String: Any]) {
        super.init()
        
        setValuesForKeys(dict)
    }
    
    override func setValue(_ value: Any?, forKey key: String) {
        
        //根据命名空间和传过来的名字获取属性类名,capitalized将字符串首字母转换为大写
        if let clz = ClazUtil.invoke(clzName: key.capitalized) as? BasicModel.Type {
            // 实例化对象
            let model = clz.init(dict: value as! [String: Any])
            // 将字典赋值给对象属性
            super.setValue(model, forKey: key)
            return
        }
        super.setValue(value, forKey: key)
    }
    
    // 覆盖父类处理不存在的属性,否则遇到不存在的属性时会崩溃
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        // 什么也不做,则遇到不存在的属性时忽略
    }
    
    // 重新设置描述信息
    override var description: String{
        return ClazUtil.resetDescription(obj: self)
    }
    
    
    // MARK: - 归档和解档
    // 归档 - 在把当前对象保存到磁盘前,将对象编码成二进制数据,与网络的序列化概念类似
    func encode(with aCoder: NSCoder) {
        ClazUtil.encode(with: aCoder, obj: self)
    }
    
    // 解档 - 从磁盘加载二进制文件,转换成对象时调用,与网络的反序列化类似
    // 没有继承性,所有对象只能解档出当前的类对象
    required init?(coder aDecoder: NSCoder) {
        super.init()
        ClazUtil.decode(coder: aDecoder, obj: self)
    }

}
